package com.tarena.lbs.content.service.impl;

import com.alibaba.nacos.common.utils.CollectionUtils;
import com.github.pagehelper.PageInfo;
import com.tarena.lbs.base.protocol.model.Result;
import com.tarena.lbs.base.protocol.pager.PageResult;
import com.tarena.lbs.content.dao.mapper.CategoryMapper;
import com.tarena.lbs.content.dao.repository.CategoryRepository;
import com.tarena.lbs.content.pojo.param.ArticleCategoryParam;
import com.tarena.lbs.content.pojo.po.ArticleCategoryPO;
import com.tarena.lbs.content.pojo.query.ArticleCategoryQuery;
import com.tarena.lbs.content.pojo.vo.ArticleCategoryVO;
import com.tarena.lbs.content.service.CategoryService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryRepository categoryRepository;
    @Override
    public PageResult<ArticleCategoryVO> pageList(ArticleCategoryQuery query) {
        // 创建一个新的分页结果对象，用于存储最终的分页查询结果
        PageResult<ArticleCategoryVO> voPage = new PageResult<>();
        //total objects pageNo pageSize totalPage
        // 调用 adminRepository 的 gePages 方法进行分页查询，获取包含管理员持久化对象的分页信息
        PageInfo<ArticleCategoryPO> pageInfo = categoryRepository.pageList(query);
        //pageNo pageSize total
        // 将分页信息中的页码设置到分页结果对象中
        voPage.setPageNo(pageInfo.getPageNum());
        // 将分页信息中的每页数量设置到分页结果对象中
        voPage.setPageSize(pageInfo.getPageSize());
        // 将分页信息中的总记录数设置到分页结果对象中
        voPage.setTotal(pageInfo.getTotal());
        // 声明一个存储管理员视图对象的列表
        List<ArticleCategoryVO> vos = null;
        // 从分页信息中获取管理员持久化对象列表
        List<ArticleCategoryPO> pos = pageInfo.getList();
        // 判断持久化对象列表是否不为空
        if (CollectionUtils.isNotEmpty(pos)){
            vos=pos.stream().map(po->{
                ArticleCategoryVO vo = new ArticleCategoryVO();
                BeanUtils.copyProperties(po,vo);
                return vo;
            }).collect(Collectors.toList());
        }
        voPage.setObjects(vos);

        return voPage;
    }

    @Override
    public Result<Void> addCategory(ArticleCategoryParam param) {
        // 直接调用Repository的addCategory方法
        return categoryRepository.addCategory(param);
    }

    @Override
    public Result<Void> updateCategory(ArticleCategoryParam param) {
        // 1. 验证参数
        if(param.getId() == null) {
            return Result.fail();
        }

        // 2. 封装数据
        ArticleCategoryPO poParam = assembleUpdateArticleCategoryPO(param);

        // 3. 更新数据库
        categoryRepository.updateCategory(poParam);

        return Result.success();
    }

    private ArticleCategoryPO assembleUpdateArticleCategoryPO(ArticleCategoryParam param) {
        ArticleCategoryPO po = new ArticleCategoryPO();
        BeanUtils.copyProperties(param, po);
        po.setUpdateTime(new Date());
        return po;
    }
    @Override
    public Result<Void> deleteCategory(Integer id) {
        // 1. 验证参数
        if(id == null) {
            return Result.fail();
        }

        // 2. 调用Repository层执行假删除
        categoryRepository.deleteCategory(id);

        return Result.success();
    }


}
